package cn.edu.swu.miniwebsvr.core;

import cn.edu.swu.miniwebsvr.handler.DefaultHandler;
import cn.edu.swu.miniwebsvr.handler.EchoHandler;
import cn.edu.swu.miniwebsvr.handler.TimeHandler;
import java.util.HashMap;
import java.util.Map;

public class Config {
    private final int port = 8080;
    private final String webRoot = "webroot";
    private final Map<String, Handler> handlerMap = new HashMap<>();

    private Config() {
        handlerMap.put("/", new DefaultHandler());
        handlerMap.put("/time", new TimeHandler());
        handlerMap.put("/echo", new EchoHandler());
    }

    public static Config getInstance() {
        return Holder.INSTANCE;
    }

    private static class Holder {
        private static final Config INSTANCE = new Config();
    }

    public int getPort() {
        return port;
    }

    public String getWebRoot() {
        return webRoot;
    }

    public Handler getHandler(String url) {
        // TODO: [222024321072047/李明燊] 实现 URL 精确匹配或基础路径匹配逻辑

        // 1. 首先尝试精确匹配
        if (handlerMap.containsKey(url)) {
            return handlerMap.get(url);
        }

        // 2. 如果精确匹配失败，尝试基础路径匹配
        // 例如：URL为 /time/current 时，匹配到 /time 处理器
        // 或者 URL为 /echo/test 时，匹配到 /echo 处理器

        // 查找URL中最长的匹配前缀
        String longestMatch = null;
        for (String pattern : handlerMap.keySet()) {
            // 跳过根路径，避免所有URL都匹配到根路径
            if ("/".equals(pattern)) {
                continue;
            }

            // 检查URL是否以pattern开头
            if (url.startsWith(pattern)) {
                // 确保匹配的是完整路径段
                // 例如：/time 匹配 /time/current，但不匹配 /times
                if (url.length() == pattern.length() ||
                        url.charAt(pattern.length()) == '/') {
                    // 选择最长的匹配模式
                    if (longestMatch == null || pattern.length() > longestMatch.length()) {
                        longestMatch = pattern;
                    }
                }
            }
        }

        // 如果找到了基础路径匹配，返回对应的处理器
        if (longestMatch != null) {
            return handlerMap.get(longestMatch);
        }

        // 3. 如果都没有匹配到，返回默认处理器
        return handlerMap.get("/");
    }

    // 添加新的URL处理器映射
    public void addHandler(String urlPattern, Handler handler) {
        if (urlPattern != null && handler != null) {
            handlerMap.put(urlPattern, handler);
        }
    }

    // 移除URL处理器映射
    public void removeHandler(String urlPattern) {
        handlerMap.remove(urlPattern);
    }

    // 获取所有已注册的URL模式
    public String[] getRegisteredPatterns() {
        return handlerMap.keySet().toArray(new String[0]);
    }

    // 检查URL模式是否已注册
    public boolean isPatternRegistered(String urlPattern) {
        return handlerMap.containsKey(urlPattern);
    }
}
